package objetosGraficos;

import java.awt.Point;
import java.util.Random;

import javax.swing.ImageIcon;

import logica.Reproductor;

/**
 * Clase abstracta para representar las naves enemigas del juego.
 * @author Arró Gonzalo - Bancalá Christian
 *
 */
public abstract class NaveEnemiga extends Nave{

	//Atributos
	private int puntaje;
	private Point vector;
	private Random aleatorio;
	private boolean encendida;
	private boolean balaEnPantalla = false;
	protected int SALUD_DEFAULT;
	
	//Los siguientes parametros son las distintas opciones posibles a utilizar a la hora de realizar un movimiento
	public static final int ARRIBA = 0, 
			ARRIBA_DERECHA = 1, 
			DERECHA = 2, 
			ABAJO_DERECHA = 3, 
			ABAJO = 4, 
			ABAJO_IZQUIERDA = 5, 
			IZQUIERDA = 6,			
			ARRIBA_IZQUIERDA = 7;
	
	//Constructor
	public NaveEnemiga(int factorMovimiento, ImageIcon image, int ancho,
			int alto, String nombre, int puntaje,int salud, int danioBala) {
		super(factorMovimiento, image, ancho, alto, nombre, salud, danioBala);
		this.puntaje = puntaje;
		this.SALUD_DEFAULT = salud;
		this.aleatorio = new Random();
		this.setMovimiento(NaveEnemiga.ABAJO);
		this.setFocusable(false);
		this.setLocation(551,0);
		this.encendida = false;
	}
	
	// Métodos

	/**
	 * Activa la nave.
	 */
	public void encender (){
		encendida = true;
		this.setIcon(SpriteStore.get().getImage(this.getNombre()));
		this.setSalud(SALUD_DEFAULT);
	}

	/**
	 * Retorna el estado de la nave.
	 * @return el estado de la nave.
	 */
	public boolean getEstado (){
		return encendida;
	}
	
	/**
	 * Retorna un vector que luego se usa para mover la nave en una dirección específica.
	 * @return vector que indica el movimiento de la nave.
	 */
	public Point getMovimiento (){
		return vector;
	}
	
	/**
	 * Recibe un entero y en base al mismo selecciona un tipo de movimiento para la nave.
	 * @param movimiento movimiento elegido
	 */
	public void setMovimiento (int movimiento){
		
		switch (movimiento) {
		case 0:
			vector = new Point (0,-1);
			break;
		case 1:
			vector = new Point (1,-1);
			break;
		case 2:
			vector = new Point (1,0);
			break;
		case 3:
			vector = new Point (1,1);
			break;
		case 4:
			vector = new Point (0,1);
			break;
		case 5:
			vector = new Point (-1,1);
			break;
		case 6:
			vector = new Point (-1,0);
			break;
		case 7:
			vector = new Point (-1,-1);
			break;
			
		}
	}
	

	/**
	 * Mueve la nave.
	 */
	public void mover(){
		try {
			this.setLocation(this.getX() + (this.vector.x * this.getFactor()), this.getY() + (this.vector.y * this.getFactor()));
			rePos();
		}catch (NullPointerException ex) {
			System.out.println("No se ha establecido el movimiento de una nave");
		}
	}
	
	/**
	 * La nave muere y deja de estar activa.
	 */
	public void morir() {
		try {
			
			this.setIcon(SpriteStore.get().getImage("EXPLOTAR"));
			Reproductor r = new Reproductor ();
			r.cargarAudio("explosion.mp3");
			r.reproducirdetener();
			Thread.sleep(100);
			this.setLocation(550 + aleatorio.nextInt(1000),aleatorio.nextInt(750));
			this.setMovimiento(this.ABAJO);
			this.setSalud(0);
			this.encendida = false;
			this.repaint();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	//Reposiciona la nave en una zona aleatoria y con el movimiento predeterminado
	private void rePos () {
		int x = aleatorio.nextInt(500);
		if ((this.getX() < 0 - this.getWidth()) || (this.getX() > 550 + this.getWidth()) || (this.getY() > 700+ this.getHeight())){
			this.setLocation(x, -30);
			this.setMovimiento(NaveEnemiga.ABAJO);
		}
	}
	
	/**
	 * Retorna el puntaje de la nave.
	 * @return el puntaje que otorga la nave.
	 */
	public int getPuntaje (){
		return puntaje;	
	}
	
	/**
	 * Retorna el estado de la bala de la nave.
	 * @return el estado de la bala de la nave.
	 */
	public boolean getEstadoBala (){
		return balaEnPantalla;
	}
	
	/**
	 * Setea el estado de la bala de la nave. Operación requerida por el hilo 'DisparosEnemigos'
	 * @param est el estado de la bala de la nave.
	 */
	public void setEstadoBala (boolean est){
		balaEnPantalla = est;
	}

}
